package api

import (
	"beego/service"
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego"
)

type MessageController struct {
	beego.Controller
}

func init() {
	// 在初始化控制器时，要注册对应模型结构体，也可以在具体方法内注册
}

/**
 * 处理POST参数结构体
 */

type PostInfo struct {
	Id   interface{} `json:"id"`   // 注意首字母大写(json响应展示的字段)
	Name string      `json:"name"` // 并且写明与json字段的映射关系，否则Unmarshal函数不好用
}

/**
 * @Title ListGet
 * @Description 获取前端参数
 */

func (c *MessageController) ListGet() {
	page, _ := c.GetInt(":page", 1)
	retData := make(map[string]interface{})

	// 处理Post参数(POST form-data)
	retData["Id"] = c.Input().Get("id")
	Msg := fmt.Sprintf("前端传参：[Id=%s]，数据类型是：%T", retData["Id"], retData["Id"])
	retData["Msg"] = Msg

	// 处理Post参数(POST json)
	var PostInfo PostInfo
	body := c.Ctx.Input.RequestBody // 这是request的body 的json二进制数据
	json.Unmarshal(body, &PostInfo) // 解析二进制json，把结果放进PostInfo中
	fmt.Printf("%v", PostInfo.Id)
	if PostInfo.Id == nil {
		PostInfo.Id = ""
	}

	retData["Page"] = page
	retData["Result"] = PostInfo
	retData["Description"] = "Id是Post form-data，x-www-form-encoded方式获取参数值，Page是Url地址栏伪静态参数获取值，Result是POST json方式获取。"
	c.Data["json"] = retData
	c.ServeJSON() // 对json进行序列化输出
	c.StopRun()
}

/**
 * @Title ChanSet
 * @Description 操作chan类型
 */

func (c *MessageController) ChanSet() {
	// 1，申明int类型chan，长度为5
	ch := make(chan int, 5)
	// 2，发送数据到ch
	ch <- 23
	ch <- 24
	// 3，关闭chan
	close(ch)
	// 4，从一个chan中接收值。
	x, ok := <-ch
	if ok {
		fmt.Println("One Received: ", x)
	}

	// 5，从一个chan中接收值。
	x, ok = <-ch
	if !ok {
		fmt.Println("channel closed, data invalid.")
	} else {
		fmt.Println("Two Received: ", x)
	}

	// JSON数据处理
	ret := service.ReturnMsg{
		Code: 200, Msg: "Success",
	}
	ret.Code = 10001
	DataMap := make(map[string]interface{})
	DataMap["chan"] = x
	ret.Data = DataMap
	ret.Msg = "请输入有效参数!"
	c.Data["json"] = ret
	c.ServeJSON() // 对json进行序列化输出
	c.StopRun()
}
